import { Injectable, Inject } from '@nestjs/common';
import {
  Department,
  DepartmentModelReturnType,
  CreateDepartmentDto,
  UpdateDepartmentDto
} from '@schemas';
import { QueryDepartmentDto } from './dto/queryDepartmentDto';

@Injectable()
export class DepartmentService {
  constructor(
    @Inject(Department.name)
    private readonly department: DepartmentModelReturnType
  ) {}

  /**
   * 创建部门
   * @param createDepartmentDto 创建部门参数
   * @returns
   */
  create(createDepartmentDto: CreateDepartmentDto) {
    return this.department.create(createDepartmentDto);
  }

  /**
   * 查找所有角色
   * @returns
   */
  findAll() {
    return this.department.find();
  }

  /**
   * 根据查询参数分页查询部门
   * @param dto 查询参数
   * @returns
   */
  async pageQuery(dto: QueryDepartmentDto) {
    // 解构赋值，从dto中获取limit、page、intro、name、createAt
    const { limit, page, name, leader, createAt } = dto;
    // 初始化query为空对象
    const query = {} as any;
    // 如果name存在，则将name添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (name) {
      query.name = { $regex: name, $options: 'i' };
    }
    // 如果intro存在，则将intro添加到query中，使用正则表达式进行模糊匹配，不区分大小写
    if (leader) {
      query.leader = { $regex: leader, $options: 'i' };
    }
    // 如果createAt存在，则将createAt添加到query中，使用$gte和$lte进行范围查询
    if (createAt) {
      query.createdAt = {
        $gte: new Date(createAt[0]),
        $lt: new Date(createAt[1])
      };
    }
    // 使用aggregate方法进行查询，统计符合条件的总数
    const total = await this.department.aggregate([
      {
        $match: query
      },
      {
        $count: 'total'
      }
    ]);
    // 使用aggregate方法进行查询，分页查询
    const list = await this.department.aggregate([
      {
        $match: query
      },
      {
        $skip: (page - 1) * limit
      },
      {
        $limit: limit
      }
    ]);
    // 返回查询结果，包括总数和数据
    return {
      total: total[0]?.total || 0,
      list
    };
  }

  findRecode() {
    return this.department.aggregate([
      {
        $project: {
          _id: 1,
          name: 1
        }
      }
    ]);
  }

  /**
   * 根据id查找部门
   * @param id 部门id
   * @returns
   */
  findOne(id: string) {
    return this.department.findById(id);
  }

  /**
   * 根据id更新部门
   * @param id 部门id
   * @param updateRoleDto
   * @returns
   */
  update(id: string, updateRoleDto: UpdateDepartmentDto) {
    return this.department.findByIdAndUpdate(id, updateRoleDto, { new: true });
  }

  /**
   * 根据id删除部门
   * @param id 部门id
   * @returns
   */
  remove(id: string) {
    return this.department.findByIdAndDelete(id);
  }
}
